#include <iostream>
#include <cstdlib>
using namespace std;
/* 
删除没有没有头指针和尾指针的循环链表中指定元素p的前驱
 */
typedef struct lnode
{
    int data;
    struct lnode *next;
} lnode, *linklist;
int a[] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
// 建立循环链表
void makelist(linklist &l)
{
    lnode *s, *r;
    l = (lnode *)malloc(sizeof(lnode));
    l->data = a[0];
    l->next = nullptr;
    r = l;
    for (int i = 1; i < sizeof(a) / sizeof(int); i++)
    {
        s = (lnode *)malloc(sizeof(lnode));
        s->data = a[i];
        s->next = nullptr;
        r->next = s;
        r = s;
        /* code */
    }
    r->next = l;
}

void printlist(linklist l)
{
    lnode *p = l;
    while (p->next != l)
    {
        cout << p->data << " ";
        p = p->next;
        /* code */
    }
    cout << p->data << endl;
}
// 设置指针p，q，r分别指向p，p的后继，q的后继，同时移动指针q和r
// 当个r的后继等于p的时候，r就是待删除的结点
void delpre(linklist &l)
{
    lnode *p, *q, *r;
    p = l;
    q = p->next;
    r = q->next;
    while (r->next != p)
    {
        q = q->next;
        r = r->next;
        /* code */
    }
    // 删除r结点
    q->next = p;
    free(r);
}
int main(int argc, char const *argv[])
{
    linklist l;
    makelist(l);
    printlist(l);
    delpre(l);
    printlist(l);
    return 0;
}
